package br.com.ecomanda.managedbean;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;

import br.com.ecomanda.controller.EComandaController;
import br.com.ecomanda.enumerations.StatusPedidoEnum;
import br.com.ecomanda.exceptions.BusinessException;
import br.com.ecomanda.exceptions.ComandaAbertaMaisDeUmaVezException;
import br.com.ecomanda.model.Comanda;
import br.com.ecomanda.model.Funcionario;
import br.com.ecomanda.model.OperacaoComanda;
import br.com.ecomanda.model.Pedido;
import br.com.ecomanda.util.JSFUtil;

public class ListarPedidosBean implements Serializable {
	
	private static final long serialVersionUID = -5422175696652229530L;

	private EComandaController parent;

	private Funcionario funcionario;

	private Comanda comanda;

	private OperacaoComanda operacaoComanda;

	private Pedido pedidoDetalhado;

	private Pedido pedidoPronto;

	private Pedido pedidoEntregue;

	private Pedido pedidoCancelado;

	private int idPedidoSelecionado;

	private List<Pedido> pedidos;
	
	@PostConstruct
	public void init(){
		String comandaIdString = (String) JSFUtil.getRequestAttribute("comanda");
		
		int comandaId = 0;
		try{
			comandaId = Integer.parseInt(comandaIdString);
		} catch (NumberFormatException e) {
			return;
		}
		
		this.comanda = parent.getComandaController().getComanda(comandaId);
		if( comanda == null )
			return;
		
		try {
			this.operacaoComanda = parent.getOperacaoComandaController().getOperacaoAberta(comanda);
		} catch (ComandaAbertaMaisDeUmaVezException e) {
			return;
		}
		
		this.pedidos = parent.getPedidoController().getPedidos(operacaoComanda);
	}

	public ListarPedidosBean() {
		this.parent = (EComandaController) JSFUtil.getFromSession("parent");
		this.funcionario = (Funcionario) JSFUtil.getFromSession("funcionario");
	}

	public void consultarComanda() {

		if (comanda == null) {
			JSFUtil.addFacesErrorMessage("Comanda inexistente!");
			return;
		}

		try {
			this.operacaoComanda = parent.getOperacaoComandaController()
					.getOperacaoAberta(comanda);

			if (operacaoComanda == null) {
				JSFUtil.addFacesErrorMessage("Comanda ENCERRADA!");
				return;
			}

			pedidos = parent.getPedidoController().getPedidos(operacaoComanda);
		} catch (BusinessException e) {
			JSFUtil.addFacesErrorMessage(e.getMessage());
		}
	}

	public Comanda getComanda() {
		return comanda;
	}

	public int getIdPedidoSelecionado() {
		return idPedidoSelecionado;
	}

	public OperacaoComanda getOperacaoComanda() {
		return operacaoComanda;
	}

	private Pedido getPedido(int id) {
		for (Pedido pedido : pedidos)
			if (pedido.getIdPedido() == id)
				return pedido;
		return null;
	}

	public Pedido getPedidoCancelado() {
		return pedidoCancelado;
	}

	public Pedido getPedidoDetalhado() {
		return pedidoDetalhado;
	}

	public Pedido getPedidoEntregue() {
		return pedidoEntregue;
	}

	public Pedido getPedidoPronto() {
		return pedidoPronto;
	}

	public List<Pedido> getPedidos() {
		return pedidos;
	}

	public double getValorTotalDaComanda() {
		if (operacaoComanda == null)
			return 0;
		return parent.getPagamentoController().getValorDaOperacao(
				operacaoComanda);
	}

	public void setComanda(Comanda comanda) {
		this.comanda = comanda;
	}

	public void setOperacaoComanda(OperacaoComanda operacaoComanda) {
		this.operacaoComanda = operacaoComanda;
	}

	public void setPedidoCancelado(int id) {
		pedidoCancelado = getPedido(id);

		try {
			parent.getPedidoController().atualizarStatusPedido(pedidoCancelado,
					StatusPedidoEnum.CANCELADO, funcionario);

			JSFUtil.addFacesInformationMessage("Pedido Cancelado!");
		} catch (BusinessException e) {
			JSFUtil.addFacesErrorMessage(e.getMessage());
		} catch (Exception e) {
			JSFUtil.addFacesErrorMessage(e.getMessage());
			e.printStackTrace();
		}

	}

	public void setPedidoDetalhado(int id) {
		pedidoDetalhado = getPedido(id);
	}

	public void setPedidoEntregue(int id) {
		pedidoEntregue = getPedido(id);

		try {
			parent.getPedidoController().atualizarStatusPedido(pedidoEntregue,
					StatusPedidoEnum.ENTREGUE, funcionario);

			JSFUtil.addFacesInformationMessage("Pedido Entregue!");
		} catch (BusinessException e) {
			JSFUtil.addFacesErrorMessage(e.getMessage());
		} catch (Exception e) {
			JSFUtil.addFacesErrorMessage(e.getMessage());
			e.printStackTrace();
		}

	}

	public void setPedidoPronto(int id) {
		pedidoPronto = getPedido(id);

		try {
			parent.getPedidoController().atualizarStatusPedido(pedidoPronto,
					StatusPedidoEnum.PRONTO, funcionario);

			JSFUtil.addFacesInformationMessage("Pedido Pronto!");
		} catch (BusinessException e) {
			JSFUtil.addFacesErrorMessage(e.getMessage());
		} catch (Exception e) {
			JSFUtil.addFacesErrorMessage(e.getMessage());
			e.printStackTrace();
		}

	}

}
